package dimensional.one;/*
 * 1. 数组的理解（Array）
 *      Java中的容器：数组、集合框架：在内存中对多个数据的存储。
 * 2.几个相关概念：
 *      数组名
 *      数组元素
 *      数组下标
 *      数组长度
 * 3.数组的特点
 *      数组中的元素是依次紧密排列的，有序的。
 *      数组，属于引用数据类型的变量。数组的元素，既可以是基本数据类型，也可以是引用数据类型。
 *      数组，一旦初始化完成，其长度就确定了，并且其长度不可更改。
 *      创建数组对象会在内存中开辟一整块“连续的空间”。占据的空间的大小，取决于数组的长度和数组中元素的类型。
 * 4.变量按照数据类型的分类
 *      基本数据类型
 *          byte \ short \ int \ long ; float \ double; char \ boolean
 *      引用数据类型
 *          类、数组、接口、枚举、注释、记录
 * 5.数组的分类
 *      按照元素的类型：
 *          基本数据类型元素的数组；
 *          引用数据类型元素的数组
 *      按照数组的维数：
 *          一维数组， 二维数组 ...
 * 6.一维数组的使用（6个基本点）
 *      > 数组的声明和初始化
 *      > 调用数组的指定元素
 *      > 数组的属性：length，表示数组的长度
 *      > 数组的遍历
 *      > 数组元素的默认初始化
 *      > 一维数组的内存解析（难）
 *
 * 7.数组元素的默认初始化值的情况
 *  > 整形: 0
 *  > 浮点型: 0.0
 *  > 字符型:
 *  > boolean: false
 *  > 引用数据类型
 *
 * 8.一维数组的内存解析
 *  Java中的内存结构是如何划分的？（主要关心JVM的运行时内存环境）
 *      将内存区域划分为5个部分：
 *      >    程序计数器、虚拟机栈、本地方法栈、堆、方法区
 *      >    与目前数组相关的内存结构：  eg: int[] arr = new int[]{1,2,3};
 *          > 虚拟机栈：用于存放方法中声明的变量。    eg:arr
 *          > 堆：用于存放数组的实体（即，数组中的所有元素）。
 *  举例：具体一维数组的代码的内存解析
 *
 */

/*
 * 数组角标从 0 开始：
 *  结合内存编址的特点， index 描述的是相对内存起始地址的偏移量。
 */
public class Main {
    public static void main(String[] args) {
        // 数组的声明和初始化

        double[] prices = new double[]{1, 2, 45};

        // 声明数组
        String[] foods;
        // 数组的初始化
        foods = new String[]{"拍黄瓜", "酸辣土豆丝"};

        // 数组的声明和初始化
        // 动态初始化：数组变量的赋值与数组元素的赋值操作分开进行。
        String[] students = new String[4];

        // 其他正确方式
        int[] arr = new int[4];
        int[] arr1 = {1, 2, 3, 4}; // 类型推断

        // 数组的长度：用来描述数组容器中容器的大小
        // 使用length属性来表示
        System.out.println(foods.length);

        // 遍历数组
        for (String food : foods) {
            System.out.println(food);
        }

        System.out.println("数组元素的默认初始化值");
        System.out.println(arr[0]);     // 0
        System.out.println(students[0]); // null
        boolean[] b = new boolean[3];
        float[] f = new float[4];
        double[] d = new double[1];
        char[] c = new char[5];
        char[] c2 = new char[2];
        System.out.println(b[0]);  // false
        System.out.println(f[0]);  // 0.0
        System.out.println(d[0]);  // 0.0


        if (c[0] == 0 && c2[0] == '\u0000') {
            System.out.print("char[] 元素的默认值为Ascii码：0 ----");
            System.out.println(c[0]);  // ascii: 0
        }

        // 一维数组的内存解析
        int[] array1 = new int[4];
        array1[0] = 0;
        array1[1] = 10;
        array1[2] = 20;

        System.out.println(array1[0]);
        System.out.println(array1[1]);
        System.out.println(array1[2]);

        int[] array2 = array1;
        array2[2] = 21;
        System.out.println(array1[2]);

    }
}